package com.auto.api.core.type;

import com.auto.api.core.type.chain.JsonTypeHandlerChain;
import com.auto.api.core.type.json.JsonTypeHandler;
import com.auto.api.core.type.json.torna.TornaCollectionApiResultJsonTypeHandler;
import com.auto.api.core.type.json.torna.TornaCommonApiResultJsonTypeHandler;
import com.auto.api.core.type.json.torna.TornaMapApiResultJsonTypeHandler;
import com.auto.api.core.type.json.torna.TornaObjectApiResultJsonTypeHandler;
import com.auto.api.core.type.json.yapi.CollectionApiResultJsonTypeHandler;
import com.auto.api.core.type.json.yapi.CollectionJsonTypeHandler;
import com.auto.api.core.type.json.yapi.CommonApiResultJsonTypeHandler;
import com.auto.api.core.type.json.yapi.CommonJsonTypeHandler;
import com.auto.api.core.type.json.yapi.MapApiResultJsonTypeHandler;
import com.auto.api.core.type.json.yapi.MapResultJsonTypeHandler;
import com.auto.api.core.type.json.yapi.ObjectApiResultJsonTypeHandler;
import com.auto.api.core.type.json.yapi.ObjectResultJsonTypeHandler;
import java.util.List;
import java.util.Objects;

/**
 * @program:
 * @description: 类型工具
 * @author: liangshf
 * @create: 2020-09-24
 */
public class TypeResultJsonRegister {
    public static JsonTypeHandlerChain jsonTypeHandler = new JsonTypeHandlerChain();

    static {
        //倒序添加 Common 需要在每种类型最后检查
        jsonTypeHandler.addHandler(new CommonJsonTypeHandler());
        jsonTypeHandler.addHandler(new MapResultJsonTypeHandler());
        jsonTypeHandler.addHandler(new ObjectResultJsonTypeHandler());
        jsonTypeHandler.addHandler(new CollectionJsonTypeHandler());

        jsonTypeHandler.addHandler(new CommonApiResultJsonTypeHandler());
        jsonTypeHandler.addHandler(new MapApiResultJsonTypeHandler());
        jsonTypeHandler.addHandler(new ObjectApiResultJsonTypeHandler());
        jsonTypeHandler.addHandler(new CollectionApiResultJsonTypeHandler());

        jsonTypeHandler.addHandler(new TornaCommonApiResultJsonTypeHandler());
        jsonTypeHandler.addHandler(new TornaMapApiResultJsonTypeHandler());
        jsonTypeHandler.addHandler(new TornaObjectApiResultJsonTypeHandler());
        jsonTypeHandler.addHandler(new TornaCollectionApiResultJsonTypeHandler());
    }

    public void addTypeHandler(JsonTypeHandler typeHandler) {
        if (Objects.isNull(typeHandler)) {
            throw new RuntimeException("add JsonTypeHandler is null");
        }
        jsonTypeHandler.addHandler(typeHandler);
    }

    public void addHandlerList(List<JsonTypeHandler> handlerList){
        if (Objects.isNull(handlerList)) {
            throw new RuntimeException("add List<JsonTypeHandler> is null");
        }
        jsonTypeHandler.addHandlerList(handlerList);
    }
}